/**
 * 闭包
 */

function fn1 () {
    let a = 1;
    let b = 'abc'
    function fn2 () { // 执行函数定义一就会产生闭包(不用调用内部函数)
        a++;
        console.log('start');
        console.log(a);
        console.log('end');
    }
    return fn2;
}

let f = fn1();
f(); // 2
f(); // 3
f = null; // 闭包死亡: 包含闭包的函数对象成为垃圾对象


/**
 * 闭包基本应用
 */
function myModule () {
    let msg = "testMyModule";
    function doSomething () {
        console.log(msg.toUpperCase());
    };
    function doOtherthing () {
        console.log(msg.toLowerCase());
    };

    return {
        doSomething,
        doOtherthing
    };
}

let my_module = myModule();
my_module.doSomething(); // TESTMYMODULE
my_module.doOtherthing(); // testmymodule
